package tw.edu.tku.im.maze;

import java.util.ArrayList;
import java.util.List;

import org.json.JSONException;
import org.json.JSONObject;

public abstract class PacketParser {
   static List<PacketParser> parsers;
   static {
      parsers = new ArrayList<PacketParser>();
      parsers.add(RegisterRepParser.INSTANCE);
      parsers.add(RegisterReqParser.INSTANCE);
      parsers.add(LoginRepParser.INSTANCE);
      parsers.add(LoginReqParser.INSTANCE);
      parsers.add(AddRoomRepParser.INSTANCE);
      parsers.add(AddRoomReqParser.INSTANCE);
      parsers.add(EnterRoomRepParser.INSTANCE);
      parsers.add(EnterRoomReqParser.INSTANCE);
      parsers.add(LeaveRoomRepParser.INSTANCE);
      parsers.add(LeaveRoomReqParser.INSTANCE);
      parsers.add(ChangeTeamRepParser.INSTANCE);
      parsers.add(ChangeTeamReqParser.INSTANCE);
      parsers.add(UpdateRoomRepParser.INSTANCE);
      parsers.add(UpdateRoomReqParser.INSTANCE);
      parsers.add(StartGameRepParser.INSTANCE);
      parsers.add(StartGameReqParser.INSTANCE);
      parsers.add(RoomListRepParser.INSTANCE);
      parsers.add(RoomListReqParser.INSTANCE);
      parsers.add(UpdateGameRepParser.INSTANCE);
      parsers.add(UpdateGameReqParser.INSTANCE);
      parsers.add(MarkRepParser.INSTANCE);
      parsers.add(MarkReqParser.INSTANCE);
      parsers.add(EndGameRepParser.INSTANCE);
      parsers.add(EndGameReqParser.INSTANCE);
      parsers.add(HeartBeatRepParser.INSTANCE);
      parsers.add(HeartBeatReqParser.INSTANCE);
   }
   public static Packet parsePacket(JSONObject jsonObj) throws JSONException {
      String action = jsonObj.getString("action");
      for(int i=0; i<parsers.size(); i++) {
         if(parsers.get(i).acceptName().equals(action)) {
//            System.out.println(action);
            return parsers.get(i).parse(jsonObj);
         }
      }
      return null;
   }
   
   public abstract String acceptName();
   
   Packet parse(String str) throws JSONException {
      JSONObject jsonObj = new JSONObject(str);
      return parse(jsonObj);
   }
   
   public abstract Packet parse(JSONObject jsonObj) throws JSONException;
   
}
